Express 生成器教程
1. Express.js 简介和特点
Express.js 是一个基于 Node.js 的快速、开放、极简的 Web 框架。它提供了构建 Web 应用程序和 API 所需的基本功能,同时保持了灵活性和可扩展性。Express.js 的特点包括:
- 简单易用:Express.js 的 API 设计简洁,易于上手。
- 灵活性:可以轻松集成各种中间件和第三方库。
- 高性能:基于 Node.js,Express.js 具有高效的异步 I/O 处理能力。
- 社区支持:拥有庞大的社区和丰富的文档资源。
2. 环境搭建 (Node.js, npm)
在开始使用 Express.js 之前,首先需要安装 Node.js 和 npm(Node Package Manager)。
2.1 安装 Node.js
访问 Node.js 官网,下载并安装适合你操作系统的 Node.js 版本。安装完成后,可以通过以下命令验证安装是否成功:
node -v
npm -v
2.2 初始化项目
创建一个新的项目目录,并在该目录下初始化 npm:
mkdir my-express-app
cd my-express-app
npm init -y
3. 创建第一个 Express.js 应用
3.1 安装 Express.js
使用 npm 安装 Express.js:
npm install express
3.2 创建基本应用
在项目根目录下创建一个 app.js 文件,并编写以下代码:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(port, () => {
console.log(`App listening at http://localhost:${port}`);
});
3.3 运行应用
在终端中运行以下命令启动应用:
node app.js
打开浏览器,访问 http://localhost:3000,你应该会看到 "Hello World!" 的输出。
4. 路由基础
路由是指如何定义应用程序的端点(URI)以及如何响应客户端请求。
4.1 基本路由
app.get('/about', (req, res) => {
res.send('About page');
});
app.post('/submit', (req, res) => {
res.send('Form submitted');
});
4.2 路由参数
app.get('/user/:id', (req, res) => {
res.send(`User ID: ${req.params.id}`);
});
5. 中间件概念
中间件是 Express.js 的核心概念之一。它是一个函数,可以访问请求对象(req)、响应对象(res)以及应用程序的请求-响应周期中的下一个中间件函数(next)。
5.1 使用中间件
app.use((req, res, next) => {
console.log('Time:', Date.now());
next();
});
5.2 自定义中间件
function logger(req, res, next) {
console.log(`${req.method} ${req.url}`);
next();
}
app.use(logger);
6. 请求和响应对象
6.1 请求对象 (req)
请求对象包含客户端请求的所有信息,如请求头、请求体、查询参数等。
app.get('/search', (req, res) => {
const query = req.query.q;
res.send(`Search query: ${query}`);
});
6.2 响应对象 (res)
响应对象用于向客户端发送响应。
app.get('/data', (req, res) => {
res.json({ message: 'Hello from server' });
});
7. 路由进阶 (参数, 查询字符串)
7.1 路由参数
app.get('/user/:id', (req, res) => {
res.send(`User ID: ${req.params.id}`);
});
7.2 查询字符串
app.get('/search', (req, res) => {
const query = req.query.q;
res.send(`Search query: ${query}`);
});
8. 静态文件服务
Express.js 提供了内置的中间件来处理静态文件。
app.use(express.static('public'));
9. 模板引擎 (EJS, Pug)
9.1 安装 EJS
npm install ejs
9.2 配置 EJS
app.set('view engine', 'ejs');
app.get('/', (req, res) => {
res.render('index', { title: 'My Express App' });
});
10. 错误处理
10.1 基本错误处理
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something broke!');
});
11. 常用中间件介绍
11.1 body-parser
用于解析请求体。
npm install body-parser
const bodyParser = require('body-parser');
app.use(bodyParser.json());
12. 自定义中间件开发
function authMiddleware(req, res, next) {
if (req.headers.authorization === 'secret') {
next();
} else {
res.status(403).send('Forbidden');
}
}
app.use(authMiddleware);
13. 第三方中间件集成
13.1 helmet
用于增强应用的安全性。
npm install helmet
const helmet = require('helmet');
app.use(helmet());
14. 身份认证中间件
14.1 passport
用于处理用户认证。
npm install passport
const passport = require('passport');
app.use(passport.initialize());
15. 文件上传处理
15.1 multer
用于处理文件上传。
npm install multer
const multer = require('multer');
const upload = multer({ dest: 'uploads/' });
app.post('/upload', upload.single('file'), (req, res) => {
res.send('File uploaded');
});
16. MongoDB 与 Mongoose
16.1 安装 Mongoose
npm install mongoose
16.2 连接 MongoDB
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });
17. SQL 数据库 (MySQL, PostgreSQL)
17.1 安装 mysql
npm install mysql
17.2 连接 MySQL
const mysql = require('mysql');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'mydatabase'
});
connection.connect();
18. ORM 工具 (Sequelize)
18.1 安装 Sequelize
npm install sequelize
18.2 初始化 Sequelize
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: 'mysql'
});
19. 数据验证和安全性
19.1 使用 express-validator
npm install express-validator
const { body, validationResult } = require('express-validator');
app.post('/user', [
body('email').isEmail(),
body('password').isLength({ min: 5 })
], (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
res.send('Validation passed');
});
20. RESTful 设计原则
RESTful API 设计原则包括:
- 使用 HTTP 方法(GET, POST, PUT, DELETE)
- 使用名词表示资源
- 使用状态码表示操作结果
21. API 版本控制
21.1 版本控制策略
app.get('/v1/users', (req, res) => {
res.send('Version 1 Users');
});
app.get('/v2/users', (req, res) => {
res.send('Version 2 Users');
});
22. 数据序列化和反序列化
22.1 使用 JSON.stringify 和 JSON.parse
const data = { name: 'John', age: 30 };
const jsonString = JSON.stringify(data);
const parsedData = JSON.parse(jsonString);
23. API 文档生成 (Swagger)
23.1 安装 swagger-jsdoc 和 swagger-ui-express
npm install swagger-jsdoc swagger-ui-express
23.2 配置 Swagger
const swaggerJsDoc = require('swagger-jsdoc');
const swaggerUi = require('swagger-ui-express');
const swaggerOptions = {
swaggerDefinition: {
info: {
title: 'API',
version: '1.0.0'
}
},
apis: ['app.js']
};
const swaggerDocs = swaggerJsDoc(swaggerOptions);
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocs));
24. 缓存策略
24.1 使用 express-cache-controller
npm install express-cache-controller
const cacheControl = require('express-cache-controller');
app.use(cacheControl({ maxAge: 3600 }));
25. 压缩和 GZIP
25.1 使用 compression
npm install compression
const compression = require('compression');
app.use(compression());
26. 安全最佳实践
26.1 使用 helmet
const helmet = require('helmet');
app.use(helmet());
27. 跨域资源共享 (CORS)
27.1 使用 cors
npm install cors
const cors = require('cors');
app.use(cors());
28. 负载均衡
28.1 使用 nginx
配置 nginx 进行负载均衡。
29. 单元测试 (Mocha, Chai)
29.1 安装 Mocha 和 Chai
npm install mocha chai
29.2 编写测试
const chai = require('chai');
const expect = chai.expect;
describe('Array', () => {
it('should return -1 when the value is not present', () => {
expect([1, 2, 3].indexOf(4)).to.equal(-1);
});
});
30. 集成测试
30.1 使用 supertest
npm install supertest
const request = require('supertest');
const app = require('../app');
describe('GET /', () => {
it('should return 200 OK', (done) => {
request(app)
.get('/')
.expect(200, done);
});
});
31. 性能测试
31.1 使用 loadtest
npm install -g loadtest
loadtest -n 1000 -c 100 http://localhost:3000/
32. 调试技巧
32.1 使用 node-inspector
npm install -g node-inspector
node-debug app.js
33. 日志管理
33.1 使用 morgan
npm install morgan
const morgan = require('morgan');
app.use(morgan('combined'));
34. 部署到云平台 (Heroku, AWS)
34.1 部署到 Heroku
heroku create
git push heroku master
34.2 部署到 AWS
使用 AWS Elastic Beanstalk 或 EC2 进行部署。
35. 容器化 (Docker)
35.1 创建 Dockerfile
FROM node:14
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
CMD ["node", "app.js"]
35.2 构建和运行容器
docker build -t my-express-app .
docker run -p 3000:3000 my-express-app
36. 进程管理 (PM2)
36.1 安装 PM2
npm install -g pm2
36.2 启动应用
pm2 start app.js
37. 监控和日志
37.1 使用 PM2 监控
pm2 monit
38. CI/CD 流程
38.1 使用 GitHub Actions
创建 .github/workflows/ci.yml 文件:
name: CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Use Node.js
uses: actions/setup-node@v2
with:
node-version: '14'
- run: npm install
- run: npm test
39. WebSocket 集成
39.1 使用 socket.io
npm install socket.io
const http = require('http');
const server = http.createServer(app);
const io = require('socket.io')(server);
io.on('connection', (socket) => {
console.log('a user connected');
});
40. GraphQL 与 Express
40.1 使用 apollo-server-express
npm install apollo-server-express graphql
const { ApolloServer, gql } = require('apollo-server-express');
const typeDefs = gql`
type Query {
hello: String
}
`;
const resolvers = {
Query: {
hello: () => 'Hello world!',
},
};
const server = new ApolloServer({ typeDefs, resolvers });
server.applyMiddleware({ app });
41. 微服务架构
41.1 使用 seneca
npm install seneca
const seneca = require('seneca')();
seneca.add('role:math,cmd:sum', (msg, respond) => {
respond(null, { answer: msg.left + msg.right });
});